// 初始化状态 函数模块
import {observer} from "./observe/index";

export function initState(vm) {
    let opts = vm.$options;
    // console.log(opts);
    // 判断
    if (opts.props) {
        initProps(vm);
    }
    if (opts.data) {
        initData(vm);
    }
    if (opts.watch) {
        initWatch(vm);
    }
    if (opts.computed) {
        initComputed(vm);
    }
    if (opts.methods) {
        initMethods(vm);
    }
}
function initProps() {}
function initWatch() {}
function initComputed() {}
function initMethods() {}

// 数据代理
function proxy(vm, source, key) {
    Object.defineProperty(vm, key, {
        get() {
            return vm[source][key];
        },
        set(newValue) {
            vm[source][key] = newValue;
        }
    })
}

// vue2 对data初始化 有几种情况可能是函数或对象
function initData(vm) {
    // console.log('data初始化');
    let data = vm.$options.data;
    // 直接调用data()是由window调用的  需要改变this指向
    // 函数的话调用函数
    data = vm._data = typeof data === 'function' ? data.call(vm) : data;

    // 将data做了一次代理
    // 用户可以直接通过vm.xxx获取值，也可以使用vm._data.xxx获取值
    for (let item in data) {
        proxy(vm, '_data', item);
    }

    // 对数据进行观测，将数据变成响应式的
    observer(data);
}